package com.反射Reflection.引出反射;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.util.Properties;

public class ReflectionQuestion_引出反射 {
    public static void main(String[] args) throws Exception {
        /**
         * 比如说你想创建一个ww对象
         * 传统方法  new ww（）；
         * 但如果是读取配置文件后创建呢，  就比如读取 类路径和方法，让我们创建并调用方法
         * ClassFullPath = java-code/src/ww.java
         * method = hi
         * 你第一时间会想到读取出来
         * 1.拿到类名和方法名
         * 2.new classFullPath().method;
         * 这样是行不通的，因为classFullPath是字符串而不是包的全路径
         *
         *所以当读取外来配置文件是不能直接按传统方法来
         * 要用到  反射
         */
        /// 读取配置文件
        Properties properties = new Properties();
        properties.load(new InputStreamReader(new FileInputStream("java-code/src/com/反射Reflection/引出反射/class.properties")));
        /// 读取保存到信息
        String classFullPath = properties.getProperty("ClassFullPath");
        String method = properties.getProperty("method");

        /// 反射机制
        /// 注意：Class.forName(classFullPath)，传进去是这个变量必须是src下的全路径
        /// 如果一个类的路径是src/com/a/b/c的话 ，properties配置文件中必须是com.a.b.c  /换成.
        /// 1.类加载
        Class<?> cls = Class.forName(classFullPath);
        /// 2.通过类加载，得到classFullPath对应的类的对象
        Object ww = cls.newInstance();
        /// 3.通过cls得到名叫 method（hi）的方法对象  如果方法有形参，构造器后面加上参数类型（万物皆对象）
        Method method1 = cls.getMethod(method);
        /// 4.通过方法对象来实现方法的对像  以前是  对象.方法（），反射是 方法.invoke(对象)
        method1.invoke(ww);  ///调用
        System.out.println(ww.getClass());

        /// 这里可以体会到反射的高明之处，
        /// 我这里调用了hi方法，只需要该配置文件就行




    }
}
